![]() | ![]() |
/*----------------------------------------\ | Print datasets; | |-------------------------------------------| |--------------------------------------------------------------------| |---------------------------| | No argument is needed; but there are several optional arguement: | | indata: if no indata is provided, print the latest data generated; | | var: the variable names to be printed; if not provided, print all; | | where: define a subset of the datasets; if not provided, print all;| | groupby: groupby statement, how do you want to group the variables;| | having: use the statistics associated with groupby to select data; | | orderby: print the output data in the order of which variable; | | outdata: output dataset; if no, just print to list without output; | |--------------------------------| |--------------------------------------------------------------------| |---------------------------------------| | Example: | | data one; | | input str $ x y z; | | LABEL str='character' X='numeric x' y='numeric y' z='numeric z';| | datalines; | | this 2 1 213 | | is 23 1 323 | | a 1243 23 12 | | test 131 4576 1 | | to 124 23 32 | | check 1245 2 3 | | to 23 32 44 | | see 2345 43 65 | | if 23 123 090 | | print 23 34 21 | | works 21 23 322 | | ; %print(one, (distinct y, count(*) as numx), groupby=(y), | | orderby=(numx, desc y)); | | Usgae: %print(indata=, var=, inobs=, outobs=, groupby=, having=, | | where=, orderby=, outdata=)/parmbuff; | \----------------------------------------*/ %macro print/parmbuff; /*--------------------------------------------\ | Copy Right: Duo Zhou; | | Created: 6-16-2001 8:32pm; | | Purpose: Custimable print procedure; | \--------------------------------------------*/ %local _newstr_ _dlen_; %let syspbuff=%substr(%quote(%trim(%quote(%left(%quote(&syspbuff))))), 2, %eval(%length(%trim(%quote(%left(%quote(&syspbuff)))))-2)); %let syspbuff=%sysfunc(translate(%quote(&syspbuff), %str(%'), %str(%"))); %let _dlen_=$%trim(%left(%eval(%length(&syspbuff)+20))); %let _tmplast_=&syslast; %let indata=; %let var=; %let inobs=; %let outobs=; %let groupby=; %let having=; %let where=; %let orderby=; %let outdata=; %let _viewexist_=; %let _datao_=; %let _newstr_=; options nonotes; data _null_; length _string_ _substr0_ &_dlen_; _string_="&syspbuff"; _substr0_=''; if rxmatch(rxparse("$(1)"),_string_) then do; do while(rxmatch(rxparse("$(1)"),_string_)); rx=rxparse("$(1)"); call rxsubstr(rx,_string_,_pos_,_len_); _substr0_=substr(_string_, _pos_, _len_); substr(_string_, _pos_, _len_)=trimn(left(translate(_substr0_, 'À', '(', 'Á', ')', '´', ',', '®', ' '))); call rxfree(rx); end; output; end; call symput('_newstr_', trimn(left(_string_))); run; %local _xvarcnt_ _xvar_; %let _xvarcnt_=0; %do %while(%length(%qscan(%nrbquote(&_newstr_), %eval(&_xvarcnt_+1), %nrbquote(,)))); %let _xvarcnt_=%eval(&_xvarcnt_+1); %let _xvar_=%nrbquote(%qscan(%nrbquote(&_newstr_), &_xvarcnt_, %nrbquote(,))); %let _xvar_=%sysfunc(translate(%quote(&_xvar_), '(', 'À', ')', 'Á', ',', '´', ' ', '®')); %let _x2_=%trim(%left(%qscan(%quote(&_xvar_), 1, %str(=)))); %let _x3_=%substr(%quote(&_xvar_), %eval(%index(%quote(&_xvar_),%str(=))+1), %eval(%length(&_xvar_)-%index(%quote(&_xvar_),%str(=)))); %if (not %index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_xvar_))))), %str(=))) and ((%quote(&_xvarcnt_) = %quote(1)) or (%quote(&_xvarcnt_) = %quote(2))) %then %do; %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_x2_))))), %str(%()) eq 1) and (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(&_x2_))))))), %str(%))) eq 1) %then %let _x3_=%substr(%quote(%trim(%quote(%left(%quote(&_x2_))))), 2, %eval(%length(%trim(%quote(%left(%quote(&_x2_)))))-2)); %if (%quote(&_xvarcnt_) = %quote(1)) %then %let indata=&_x3_; %else %let var=&_x3_; %end; %else %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_x3_))))), %str(%()) eq 1) and (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(&_x3_))))))), %str(%))) eq 1) %then %let &_x2_=%substr(%quote(%trim(%quote(%left(%quote(&_x3_))))), 2, %eval(%length(%trim(%quote(%left(%quote(&_x3_)))))-2)); %else %let &_x2_=&_x3_; %end; %if (%length(&indata) le 0) %then %let indata=&syslast; %if (%length(&var) le 0) %then %let _allvars_=*; %else %do; %if (%index(%quote(&var), %str(,))) %then %let vardlm=%quote(,); %else %let vardlm=%quote( ); %if (%index(%quote(&var), %str(-))) %then %do; %let _convar_=; %let _dummyvar_=&var; %do %while(%index(%quote(&var), %str(-))); %let _sub1var_=%substr(%quote(&var), 1, %eval(%index(%quote(&var), %str(-))-1)); %let var=%substr(%quote(&var), %eval(%index(%quote(&var), %str(-))+1), %eval(%length(&var)-%index(%quote(&var), %str(-)))); %let _tmpvari_=0; %do %while(%length(%qscan(%nrbquote(&_sub1var_), %eval(&_tmpvari_+1), %nrbquote(&vardlm)))); %let _tmpvari_=%eval(&_tmpvari_+1); %let _tmp1var_=%nrbquote(%qscan(%nrbquote(&_sub1var_), &_tmpvari_, %%nrbquote(&vardlm))); %if (%length(%qscan(%nrbquote(&_sub1var_), %eval(&_tmpvari_+1), %nrbquote(&vardlm)))) %then %do; %if (%quote(&_convar_) eq) %then %let _convar_=%trim(%quote(%left(%quote(&_tmp1var_)))); %else %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %else %if ( %eval(%sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp1var_)))+1)) %then %do; %let _arrvarbeg_=%substr(%quote(&_tmp1var_), %eval(%sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp1var_)))+1), %eval(%length(&_tmp1var_)- %eval(%sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp1var_)))))); %let _dummykeyword_=; %let _arrvarbroot_=%substr(%quote(&_tmp1var_), 1, %sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp1var_)))); %if (%sysfunc(indexw(%quote(%upcase(&_arrvarbroot_)),%quote(DISTINCT)))) %then %do; %let _dummykeyword_=distinct ; %let _arrvarbroot_=%sysfunc(tranwrd(%quote(%upcase(&_arrvarbroot_)),%quote(DISTINCT),%quote())); %end; %if (%quote(&var) ne) %then %do; %let _tmp2var_=%nrbquote(%qscan(%nrbquote(&var), 1, %%nrbquote(&vardlm))); %if (%sysfunc(rxmatch(%sysfunc(rxparse($d $s)),&_tmp2var_))) %then %do; %let _arrvarend_=%substr(%quote(&_tmp2var_), %eval(%sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp2var_)))+1), %eval(%length(&_tmp2var_)- %eval(%sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp2var_)))))); %let _arrvareroot_=%substr(%quote(&_tmp2var_), 1,%sysfunc(rxmatch(%sysfunc(rxparse($- ($a|_))),%quote(&_tmp2var_)))); %if (%quote(%lowcase(&_arrvarbroot_)) eq %quote(%lowcase(&_arrvareroot_))) %then %do; %do _locali_=&_arrvarbeg_ %to %eval(&_arrvarend_-1); %if (%quote(&_convar_) eq) %then %let _convar_=%trim(%left(&_arrvarbroot_))%trim(%left(&_locali_)); %else %do; %if (%index(%quote(%upcase(&_dummyvar_)), %quote(DISTINCT ))) or (%sysfunc(indexw(%quote(%upcase(&_dummyvar_)), %quote(AS)))) %then %do; %if (%quote(%upcase(&_convar_)) ne %quote(DISTINCT)) and (%substr(%quote(%upcase(%trim(%quote(%left(%quote(&_convar_)))))), %eval(%length(%trim(%quote(%left(%quote(&_convar_)))))-2),3) ne %quote( AS)) %then %let _convar_=%trim(%quote(%left(%quote(&_convar_))))(%quote(&vardlm) %trim(%left(&_arrvarbroot_))%trim(%left(&_locali_)); %else %let _convar_=%trim(%quote(%left(%quote(&_convar_)))) %trim(%left(&_arrvarbroot_))%trim(%left(&_locali_)); %end; %else %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%left(&_arrvarbroot_))%trim(%left(&_locali_)); %end; %end; %end; %else %do; %if (%quote(&_convar_) eq) %then %let _convar_=%trim(%quote(%left(%quote(&_tmp1var_)))); %else %do; %if (%index(%quote(%upcase(&_dummyvar_)), %quote(DISTINCT ))) or (%sysfunc(indexw(%quote(%upcase(&_dummyvar_)), %quote(AS)))) %then %do; %if (%quote(%upcase(&_convar_)) ne %quote(DISTINCT)) and (%substr(%quote(%upcase(%trim(%quote(%left(%quote(&_convar_)))))), %eval(%length(%trim(%quote(%left(%quote(&_convar_)))))-2),3) ne %quote( AS)) %then %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %else %let _convar_=%trim(%quote(%left(%quote(&_convar_)))) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %else %let _convar_=%trim(%quote(%left(&_convar_)))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %put ==> Alert! Variable name &_tmp1var_ and &_tmp2var_ do not have the same pattern!; %end; %end; %else %do; %if (%quote(&_convar_) eq) %then %let _convar_=%trim(%quote(%left(%quote(&_tmp1var_)))); %else %do; %if (%index(%quote(%upcase(&_dummyvar_)), %quote(DISTINCT ))) or (%sysfunc(indexw(%quote(%upcase(&_dummyvar_)), %quote(AS)))) %then %do; %if (%quote(%upcase(&_convar_)) ne %quote(DISTINCT)) and (%substr(%quote(%upcase(%trim(%quote(%left(%quote(&_convar_)))))), %eval(%length(%trim(%quote(%left(%quote(&_convar_)))))-2),3) ne %quote( AS)) %then %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %else %let _convar_=%trim(%quote(%left(%quote(&_convar_)))) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %else %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %put ==> Alert! Variable name &_tmp2var_ does not have a numeric suffix!; %end; %end; %else %do; %if (%quote(&_convar_) eq) %then %let _convar_=%trim(%quote(%left(%quote(&_tmp1var_)))); %else %do; %if (%index(%quote(%upcase(&_dummyvar_)), %quote(DISTINCT ))) or (%sysfunc(indexw(%quote(%upcase(&_dummyvar_)), %quote(AS)))) %then %do; %if (%quote(%upcase(&_convar_)) ne %quote(DISTINCT)) and (%substr(%quote(%upcase(%trim(%quote(%left(%quote(&_convar_)))))), %eval(%length(%trim(%quote(%left(%quote(&_convar_)))))-2),3) ne %quote( AS)) %then %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %else %let _convar_=%trim(%quote(%left(%quote(&_convar_)))) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %else %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %put ==> Alert! No variable names are provided after &_tmp1var_ -!; %end; %end; %else %do; %if (%quote(&_convar_) eq) %then %let _convar_=%trim(%quote(%left(%quote(&_tmp1var_)))); %else %do; %if (%index(%quote(%upcase(&_dummyvar_)), %quote(DISTINCT ))) or (%sysfunc(indexw(%quote(%upcase(&_dummyvar_)), %quote(AS)))) %then %do; %if (%quote(%upcase(&_convar_)) ne %quote(DISTINCT)) and (%substr(%quote(%upcase(%trim(%quote(%left(%quote(&_convar_)))))), %eval(%length(%trim(%quote(%left(%quote(&_convar_)))))-2),3) ne %quote( AS)) %then %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %else %let _convar_=%trim(%quote(%left(%quote(&_convar_)))) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %else %let _convar_=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&_tmp1var_)))); %end; %put ==> Alert! Variable name &_tmp1var_ does not have a numeric suffix!; %end; %end; %end; %if (%index(%quote(%upcase(&_dummyvar_)), %quote(DISTINCT ))) or (%sysfunc(indexw(%quote(%upcase(&_dummyvar_)), %quote(AS)))) %then %do; %if (%quote(%upcase(&_convar_)) ne %quote(DISTINCT)) and (%substr(%quote(%upcase(%trim(%quote(%left(%quote(&_convar_)))))), %eval(%length(%trim(%quote(%left(%quote(&_convar_)))))-2),3) ne %quote( AS)) %then %let var=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&var)))); %else %let var=%trim(%quote(%left(%quote(&_convar_)))) %trim(%quote(%left(%quote(&var)))); %end; %else %let var=%trim(%quote(%left(%quote(&_convar_))))%quote(&vardlm) %trim(%quote(%left(%quote(&var)))); %end; %if (not %index(%quote(&var), %quote(,))) and (not %index(%quote(%upcase(&var)), %quote(DISTINCT ))) and (not %sysfunc(indexw(%quote(%upcase(&var)), %quote(AS)))) %then %do; %if (%sysfunc(index(%quote(&var),_ALL_))) %then %let var=*; %else %if (%sysfunc(index(%quote(%upcase(&var)),_CHARACTER_))) %then %do; %if (%sysfunc(exist(&indata))) %then %do; %let _indsid_=%sysfunc(open(&indata)); %let _innvars_=%sysfunc(attrn(&_indsid_,NVARS)); %let _convar_=; %do _invari_=1 %to &_innvars_; %let _invtype_=%sysfunc(vartype(&_indsid_, &_invari_)); %if (not %index(%quote(%upcase(&_invtype_)),%quote(N))) %then %let _convar_= %trim(%left(&_convar_)) %sysfunc(varname(&_indsid_,&_invari_)); %end; %let _invrc_=%sysfunc(close(&_indsid_)); %let var=&_convar_; %end; %end; %else %if (%sysfunc(index(%quote(%upcase(&var)),_NUMERIC_))) %then %do; %if (%sysfunc(exist(&indata))) %then %do; %let _indsid_=%sysfunc(open(&indata)); %let _innvars_=%sysfunc(attrn(&_indsid_,NVARS)); %let _convar_=; %do _invari_=1 %to &_innvars_; %let _invtype_=%sysfunc(vartype(&_indsid_, &_invari_)); %if (%index(%quote(&_invtype_),%quote(N))) %then %let _convar_= %trim(%left(&_convar_)) %sysfunc(varname(&_indsid_,&_invari_)); %end; %let _invrc_=%sysfunc(close(&_indsid_)); %let var=&_convar_; %end; %end; %else %do; %let _jvar_=0; %do %while(%length(%qscan(%quote(&var), %eval(&_jvar_+1), %quote( )))); %let _jvar_=%eval(&_jvar_+1); %let _varj_=%qscan(%quote(&var), &_jvar_, %quote( )); %if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&_varj_))))), %str(%())) and (not %index(%quote(%upcase(%sysfunc(compress(%quote(&_varj_))))),%str(LABEL=))) %then %let _varj_=&_varj_ label="&_varj_"; %if (%quote(&_jvar_) eq 1) %then %let _allvars_=&_varj_; %else %if (%length(&_varj_) gt 0) and (%quote(%upcase(&_allvars_)) ne %quote(DISTINCT)) %then %let _allvars_=%trim(%bquote(%left(%bquote(&_allvars_)))), &_varj_; %else %if (%length(&_varj_) gt 0) and (%quote(%upcase(&_allvars_)) eq %quote(DISTINCT)) %then %let _allvars_=%trim(%bquote(%left(%bquote(&_allvars_)))) &_varj_; %end; %end; %end; %else %let _allvars_=&var; %end; %if (%length(&groupby) gt 0) %then %do; %if (not %index(%quote(&groupby), %quote(,))) %then %do; %let _jgroupby_=0; %let _allgroupbys_=; %do %while(%length(%qscan(%quote(&groupby), %eval(&_jgroupby_+1), %quote( )))); %let _jgroupby_=%eval(&_jgroupby_+1); %let _groupbyj_=%qscan(%quote(&groupby), &_jgroupby_, %quote( )); %if (%quote(&_jgroupby_) eq %quote(1)) %then %let _allgroupbys_=&_groupbyj_; %else %if (%length(&_groupbyj_) gt 0) %then %let _allgroupbys_=%trim(%quote(%left(%quote(&_allgroupbys_)))), &_groupbyj_; %end; %let groupby=&_allgroupbys_; %end; %end; %if (%length(&orderby) gt 0) %then %do; %if (not %index(%quote(&orderby), %quote(,))) and (not %sysfunc(indexw(%quote(%upcase(&orderby)), %quote(DESC)))) and (not %sysfunc(indexw(%quote(%upcase(&orderby)), %quote(DESCENDING)))) and (not %sysfunc(indexw(%quote(%upcase(&orderby)), %quote(ASC)))) and (not %sysfunc(indexw(%quote(%upcase(&orderby)), %quote(ASCENDING)))) %then %do; %let _jorderby_=0; %let _allorderbys_=; %do %while(%length(%qscan(%quote(&orderby), %eval(&_jorderby_+1), %quote( )))); %let _jorderby_=%eval(&_jorderby_+1); %let _orderbyj_=%qscan(%quote(&orderby), &_jorderby_, %quote( )); %if (%quote(&_jorderby_) eq %quote(1)) %then %let _allorderbys_=&_orderbyj_; %else %if (%length(&_orderbyj_) gt 0) %then %let _allorderbys_=%trim(%quote(%left(%quote(&_allorderbys_)))), &_orderbyj_; %end; %let orderby=&_allorderbys_; %end; %else %do; %let _jorderby_=0; %let _allorderbys_=; %do %while(%length(%qscan(%quote(&orderby), %eval(&_jorderby_+1), %quote(,)))); %let _jorderby_=%eval(&_jorderby_+1); %let _orderbyj_=%qscan(%quote(&orderby), &_jorderby_, %quote(,)); %if (%quote(&_jorderby_) eq %quote(1)) %then %do; %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(DESC)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(DESC), %quote( ))))))) DESC; %else %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(DESCENDING)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(DESCENDING), %quote( ))))))) DESC; %else %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(ASC)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(ASC), %quote( ))))))) ASC; %else %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(ASCENDING)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(ASCENDING), %quote( ))))))) ASC; %else %let _allorderbys_=&_orderbyj_; %end; %else %if (%length(&_orderbyj_) gt 0) %then %do; %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(DESC)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(&_allorderbys_)))), %trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(DESC), %quote( ))))))) DESC; %else %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(DESCENDING)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(&_allorderbys_)))), %trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(DESCENDING), %quote( ))))))) DESC; %else %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(ASC)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(&_allorderbys_)))), %trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(ASC), %quote( ))))))); %else %if (%sysfunc(indexw(%quote(%upcase(&orderby)), %quote(ASCENDING)))) %then %let _allorderbys_=%trim(%quote(%left(%quote(&_allorderbys_)))), %trim(%quote(%left(%quote(%sysfunc(tranwrd(%quote(%upcase(&_orderbyj_)), %quote(ASCENDING), %quote( ))))))); %else %let _allorderbys_=%trim(%quote(%left(%quote(&_allorderbys_)))), &_orderbyj_; %end; %end; %let orderby=&_allorderbys_; %end; %end; %let _idata_=0; %do %while(%length(%qscan(%quote(&indata), %eval(&_idata_+1), %str( ,)))); %let _idata_=%eval(&_idata_+1); %let _datai_=%qscan(%quote(&indata), &_idata_, %str( ,)); %if (%quote(&outdata) ne) %then %let _datao_=%qscan(%quote(&outdata), &_idata_, %str( ,)); %if (%sysfunc(exist(&_datai_))) or (%sysfunc(exist(&_datai_, VIEW))) %then %do; proc sql %if (%length(&inobs) gt 0) %then %do; inobs=&inobs %end; %if (%length(&outobs) gt 0) %then %do; outobs=&outobs %end;; create table _printtmp1_ as select &_allvars_ from &_datai_ %if (%length(&where) gt 0) %then where &where; %if (%length(&groupby) gt 0) %then group by &groupby; %if (%length(&having) gt 0) %then having &having; %if (%length(&orderby) gt 0) %then order by &orderby;; %if (%length(&_datao_) gt 0) %then %do; data &_datao_; set _printtmp1_; run; %end; %local _printtmp1dsid_ _printtmp1nobs_ _printtmp1rc_; %let _printtmp1dsid_=%sysfunc(open(_printtmp1_)); %if &_printtmp1dsid_ %then %do; %let _printtmp1nobs_=%sysfunc(attrn(&_printtmp1dsid_,NOBS)); %let _printtmp1rc_=%sysfunc(close(&_printtmp1dsid_)); %end; %else %goto finish; %if (%quote(&_printtmp1nobs_) le 0) %then %do; %put --> Alert! No observations were printed!; %goto finish; %end; proc contents data=_printtmp1_ out=_printtmp1cnt_(index=(varnum)) noprint; proc sql noprint; select name, label into: _printvname_ separated by '¶ ', : _printvlabel_ separated by '¶ ' from _printtmp1cnt_ order by varnum; %let _printvlabel_=%sysfunc(compress(%bquote(&_printvlabel_), %str(%'))); %let _chki_=0; %let _printvariable_=; %let _printvlabel_=%sysfunc(compress(%bquote(&_printvlabel_), %str(%"))); %let _printlabel_=LABEL ; %do %while(%length(%qscan(%quote(&_printvname_), %eval(&_chki_+1), %quote(¶)))); %let _chki_=%eval(&_chki_+1); %let _printvar_=%qscan(%quote(&_printvname_), &_chki_, %quote(¶)); %let _printvariable_=%trim(%left(&_printvariable_)) %trim(%left(&_printvar_)); %if (%length(%trim(%quote(%left(%quote(&_printvlabel_))))) gt 0) %then %let _printvlabeli_=%qscan(%quote(&_printvlabel_), &_chki_, %quote(¶)); %else %let _printvlabeli_=; %if (%length(%trim(%quote(%left(%quote(&_printvlabeli_))))) gt 0) %then %let _printlabel_=%trim(%bquote(%left(%bquote(&_printlabel_)))) %trim(%left(&_printvar_))="%trim(%bquote(%left(%bquote(&_printvlabeli_)))) %quote(<%trim(%left(&_printvar_))>)"; %else %let _printlabel_=%trim(%bquote(%left(%bquote(&_printlabel_)))) %trim(%left(&_printvar_))="%quote(<%trim(%left(&_printvar_))>)"; %end; %local _dsid_ _nobs_ _rc_; %let _dsid_=%sysfunc(open(_printtmp1cnt_)); %if &_dsid_ %then %do; %let _nobs_=%sysfunc(attrn(&_dsid_,NOBS)); %let _rc_=%sysfunc(close(&_dsid_)); %end; %else %do; %put ==> Alert! No variable names were selected!; %goto finish; %end; %local zero; %do _i_=1 %to &_nobs_; %local _resizevar_&_i_ _resizetyp_&_i_ _resizelen_&_i_ _resizemln_&_i_; %end; data _null_; set _printtmp1cnt_; call symput ('_resizevar_'||left(_n_), name); if type=2 then call symput ('_resizetyp_'||left(_n_), '$'); else call symput ('_resizetyp_'||left(_n_), ' '); call symput ('_resizelen_'||left(_n_), length); proc sql noprint; drop table _printtmp1cnt_; select 0 %do _i_=1 %to &_nobs_; %if &&_resizetyp_&_i_=$ %then ,max(length(&&_resizevar_&_i_)); %end; into :zero %do _i_=1 %to &_nobs_; %if &&_resizetyp_&_i_=$ %then ,:_resizemln_&_i_ ; %end; from _printtmp1_; data _printtmp2_; &_printlabel_; length %do _i_=1 %to &_nobs_; %if &&_resizetyp_&_i_=$ %then %do; &&_resizevar_&_i_ $ &&_resizemln_&_i_ %end; %end;; format %do _i_=1 %to &_nobs_; %if &&_resizetyp_&_i_=$ %then %do; &&_resizevar_&_i_ $ &&_resizemln_&_i_... %end; %end;; set _printtmp1_; proc print data=_printtmp2_ label OBS; var &_printvariable_; title "Output of PROC PRINT for Dataset «%upcase(%trim(%left(&_datai_)))»"; run; proc sql noprint; drop table _printtmp1_; drop table _printtmp2_; TITLE " ";quit; options notes; %put NOTE: There were %trim(%left(&_printtmp1nobs_)) observations read from the dataset %upcase(%trim(%left(&_datai_))).; %end; %else %do; %put ==> Alert! Input dataset %upcase(%trim(%left(&_datai_))) does%str(%')t exist!; %goto finish; %end; %if (%length(&_datao_) gt 0) %then %let syslast=&_datao_; %end; %finish: %if (%length(&outdata) eq 0) %then %let syslast=&_tmplast_; %mend print;